import tkinter as tk
import webbrowser
from tkinter import ttk


class FAQDialog(tk.Toplevel):
    """常见问题对话框"""

    def __init__(self, parent):
        super().__init__(parent)
        self.title("常见问题")
        self.geometry("650x550")  # 稍微调大一点窗口
        self.resizable(False, False)

        # 设置模态
        self.transient(parent)
        self.grab_set()

        # 创建样式对象
        self.style = ttk.Style()
        self._init_styles()  # 初始化所有样式
        self._init_ui()

        # 居中显示
        self.after(10, lambda: parent.app.center_dialog(self))

    def _init_styles(self):
        """初始化所有样式"""
        # 设置问题标签样式
        self.style.configure(
            "Question.TLabel",
            font=("微软雅黑", 10, "bold"),  # 加粗
            padding=(5, 8, 5, 8),
            background="#e8f0fe",  # 浅蓝色背景
            foreground="#2c5282",  # 深蓝色文字
        )
        # 设置答案标签样式
        self.style.configure(
            "Answer.TLabel",
            font=("微软雅黑", 9),
            padding=(5, 5, 5, 10),
            foreground="#4a5568",  # 深灰色文字
        )
        # 设置链接样式
        self.style.configure(
            "Link.TLabel",
            font=("微软雅黑", 9, "underline"),
            foreground="blue",
        )
        # 设置分类标题样式
        self.style.configure(
            "Section.TLabel",
            font=("微软雅黑", 12, "bold"),
            foreground="#1a365d",  # 更深的蓝色
            padding=(0, 10, 0, 5),
        )
        # 设置缩进线的样式
        self.style.configure(
            "Indent.TFrame",
            background="#cbd5e0",  # 浅灰色竖线
        )

    def _init_ui(self):
        """初始化UI"""
        # 创建主框架，使用滚动条
        main_frame = ttk.Frame(self, padding="20")
        main_frame.pack(fill=tk.BOTH, expand=True)

        # 创建Canvas和Scrollbar
        canvas = tk.Canvas(main_frame, background="#ffffff")  # 设置白色背景
        scrollbar = ttk.Scrollbar(main_frame, orient="vertical", command=canvas.yview)
        scrollable_frame = ttk.Frame(canvas, style="Main.TFrame")

        scrollable_frame.bind(
            "<Configure>", lambda e: canvas.configure(scrollregion=canvas.bbox("all"))
        )

        canvas.create_window((0, 0), window=scrollable_frame, anchor="nw", width=585)
        canvas.configure(yscrollcommand=scrollbar.set)

        # 绑定鼠标滚轮事件
        def _on_mousewheel(event):
            canvas.yview_scroll(int(-1 * (event.delta / 120)), "units")

        canvas.bind_all("<MouseWheel>", _on_mousewheel)  # Windows
        canvas.bind_all(
            "<Button-4>", lambda e: canvas.yview_scroll(-1, "units")
        )  # Linux
        canvas.bind_all(
            "<Button-5>", lambda e: canvas.yview_scroll(1, "units")
        )  # Linux

        # 确保在对话框关闭时解绑事件，防止影响其他窗口
        self.bind("<Destroy>", lambda e: canvas.unbind_all("<MouseWheel>"))

        # 添加分割线样式的Frame
        separator = ttk.Frame(scrollable_frame, height=2, style="Separator.TFrame")
        separator.pack(fill="x", pady=10)

        # 数据对比功能相关问题
        self._add_section(
            scrollable_frame,
            "数据对比功能",
            [
                {
                    "question": "什么是主键/联合主键？如何使用？",
                    "answer": [
                        "主键是用于唯一标识数据记录的字段，可以是单个字段，也可以是多个字段的组合（联合主键）。",
                        "",
                        "使用方法：",
                        "1. 在数据项列表中选择一个或多个字段",
                        '2. 点击"设为ID字段"按钮',
                        "3. 被设置为ID字段的项会显示在ID字段列表中",
                    ],
                },
                {
                    "question": "对比结果中的❌符号代表什么？",
                    "answer": [
                        "❌符号表示该字段的数据存在差异：",
                        "",
                        "- 当数据源1有而数据源2没有时，❌显示在数据源1的值后面",
                        "- 当数据源2有而数据源1没有时，❌显示在数据源2的值前面",
                        "- 当两边都有但值不同时，两边的值都会标记❌",
                    ],
                },
                {
                    "question": "如何只查看有差异的数据？",
                    "answer": [
                        "在对比结果上方的控制区域中：",
                        "",
                        '1. 取消勾选"显示全部数据"复选框',
                        "2. 此时结果表格将只显示存在差异的数据行",
                        "3. 再次勾选可恢复显示全部数据",
                    ],
                },
            ],
        )

        # 添加分割线
        ttk.Separator(scrollable_frame, orient="horizontal").pack(
            fill="x", pady=15, padx=10
        )

        # Oracle数据库相关问题
        self._add_section(
            scrollable_frame,
            "Oracle数据库",
            [
                {
                    "question": "Thin模式和Thick模式有什么区别？应该选择哪个？",
                    "answer": [
                        "两种模式的主要区别：",
                        "",
                        "Thin模式：",
                        "- 纯Java实现，无需安装Oracle客户端",
                        "- 配置简单，适合快速测试和简单查询",
                        "- 功能和性能可能受限",
                        "",
                        "Thick模式：",
                        "- 需要安装Oracle客户端",
                        "- 支持更多高级特性",
                        "- 性能更好，建议生产环境使用",
                    ],
                },
                {
                    "question": "如何配置Oracle客户端？",
                    "answer": [
                        "配置步骤：",
                        "",
                        "1. 下载Oracle Instant Client",
                        "2. 解压到本地目录",
                        "3. 在数据库配置对话框中：",
                        '   - 选择"Thick模式"',
                        "   - 填写客户端目录路径",
                        "",
                        "点击下方链接下载Oracle客户端：",
                    ],
                    "has_link": True,
                },
            ],
        )

        # 打包滚动组件
        canvas.pack(side="left", fill="both", expand=True)
        scrollbar.pack(side="right", fill="y")

        # 添加底部分割线
        ttk.Separator(self, orient="horizontal").pack(fill="x", pady=(10, 0))

        # 添加确定按钮
        btn_frame = ttk.Frame(self)
        btn_frame.pack(fill="x", padx=20, pady=15)
        ttk.Button(btn_frame, text="确定", command=self.destroy, width=15).pack(
            anchor="center"
        )

    def _add_section(self, parent, title, qa_list):
        """添加一个问答区段"""
        # 区段标题
        title_frame = ttk.Frame(parent)
        title_frame.pack(fill="x", pady=(5, 10))

        ttk.Label(
            title_frame,
            text=title,
            style="Section.TLabel",  # 使用新的分类标题样式
        ).pack(anchor="w", padx=5)

        # 添加问答项
        for qa in qa_list:
            self._add_qa_item(parent, qa)

    def _add_qa_item(self, parent, qa_data):
        """添加一个问答项"""
        frame = ttk.Frame(parent)
        frame.pack(fill="x", padx=10, pady=3)

        # 问题部分（可点击展开/折叠）
        question_frame = ttk.Frame(frame, style="QuestionFrame.TFrame")
        question_frame.pack(fill="x")

        # 展开/折叠指示器 - 为每个问题创建独立的状态变量
        expanded = tk.StringVar(value="▶")
        indicator = ttk.Label(
            question_frame,
            textvariable=expanded,
            style="Question.TLabel",
            cursor="hand2",
        )
        indicator.pack(side="left", padx=(0, 5))

        # 问题文本
        question = ttk.Label(
            question_frame,
            text=qa_data["question"],
            style="Question.TLabel",
            cursor="hand2",
        )
        question.pack(side="left", fill="x", expand=True)

        # 答案部分（初始隐藏）
        answer_frame = ttk.Frame(frame)
        content = "\n".join(qa_data["answer"])

        # 添加左侧缩进的竖线装饰
        indent_frame = ttk.Frame(answer_frame, width=3, style="Indent.TFrame")
        indent_frame.pack(side="left", fill="y", padx=(25, 10))

        # 答案内容
        answer = ttk.Label(
            answer_frame,
            text=content,
            style="Answer.TLabel",
            justify=tk.LEFT,
            wraplength=500,  # 调整宽度以适应缩进
        )
        answer.pack(side="left", fill="x", expand=True, pady=(5, 0))

        # 如果需要显示链接
        if qa_data.get("has_link"):
            link_frame = ttk.Frame(answer_frame)
            link_frame.pack(side="left", fill="x", expand=True, pady=(5, 0))
            link = ttk.Label(
                link_frame,
                text="点击下载Oracle客户端",
                style="Link.TLabel",
                cursor="hand2",
            )
            link.pack(anchor="w")
            link.bind(
                "<Button-1>",
                lambda e: webbrowser.open(
                    "https://www.oracle.com/database/technologies/instant-client/downloads.html"
                ),
            )

        # 绑定点击事件
        def toggle_answer(event=None):
            if answer_frame.winfo_viewable():
                answer_frame.pack_forget()
                expanded.set("▶")
            else:
                answer_frame.pack(fill="x")
                expanded.set("▼")

        indicator.bind("<Button-1>", toggle_answer)
        question.bind("<Button-1>", toggle_answer)
